home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Log: arc.c,v $
- * Revision 1.4 88/04/11 19:03:58 hyc
- * another omitted section. Ooops.
- *
- * Revision 1.3 88/04/11 19:01:11 hyc
- * added printf accidentally omitted...
- *
- * Revision 1.2 88/04/11 17:35:34 hyc
- * re-synch with MTS version, add squashing support.
- *
- * Revision 1.1 88/04/11 17:24:19 hyc
- * Initial revision
- *
- * Revision 1.4 87/12/20 03:39:46 hyc
- * Fix command description (MTS vs Unix usage of 'i' flag...)
- *
- * Revision 1.3 87/12/19 04:35:12 hyc
- * Change MTS to MSDOS for #ifdef of printf for image mode...
- *
- * Revision 1.2 87/12/19 04:00:18 hyc
- * MAde #ifdef of image #ifndef MSDOS...
- *
- * Revision 1.1 87/12/19 03:59:14 hyc
- * Initial revision
- *
- * Revision 1.5 87/08/13 17:02:39 hyc
- * Run thru the indent program...
- * Revision 1.4 87/07/30 03:38:15 hyc Minor junk
- *
- * Revision 1.3 87/07/21 11:39:35 hyc minor fixups
- *
- * Revision 1.2 87/07/21 06:23:13 hyc Modified according to the mods made to
- * arc 5.12 for unix.
- *
- */
-
- /*
- * ARC - Archive utility
- *
- * Version 5.20, created on 10/24/86 at 14:56:41
- *
- * (C) COPYRIGHT 1985,86 by System Enhancement Associates; ALL RIGHTS RESERVED
- *
- * By: Thom Henderson
- *
- * Description: This program is a general archive utility, and is used to
- * maintain an archive of files. An "archive" is a single file that combines
- * many files, reducing storage space and allowing multiple files to be
- * handled as one.
- *
- * Instructions: Run this program with no arguments for complete instructions.
- *
- * Programming notes: ARC Version 2 differs from version 1 in that archive
- * entries are automatically compressed when they are added to the archive,
- * making a separate compression step unecessary. The nature of the
- * compression is indicated by the header version number placed in each
- * archive entry, as follows:
- *
- * 1 = Old style, no compression
- * 2 = New style, no compression
- * 3 = Compression of repeated characters only
- * 4 = Compression of repeated characters plus Huffman SQueezing
- * 5 = Lempel-Zev packing of repeated strings (old style)
- * 6 = Lempel-Zev packing of repeated strings (new style)
- * 7 = Lempel-Zev Williams packing with improved hash function
- * 8 = Dynamic Lempel-Zev packing with adaptive reset
- * 9 = Squashing, ala Phil Katz's PKARC
- *
- * Type 5, Lempel-Zev packing, was added as of version 4.0
- *
- * Type 6 is Lempel-Zev packing where runs of repeated characters have been
- * collapsed, and was added as of version 4.1
- *
- * Type 7 is a variation of Lempel-Zev using a different hash function which
- * yields speed improvements of 20-25%, and was added as of version 4.6
- *
- * Type 8 is a different implementation of Lempel-Zev, using a variable code
- * size and an adaptive block reset, and was added as of version 5.0
- *
- * Type 9 is yet another implementation of Lempel-Zev, used originally by
- * Phil Katz in his PKARC utility.
- *
- * Verion 4.3 introduced a temporary file for holding the result of the first
- * crunch pass, thus speeding up crunching.
- *
- * Version 4.4 introduced the ARCTEMP environment string, so that the temporary
- * crunch file may be placed on a ramdisk. Also added was the distinction
- * bewteen Adding a file in all cases, and Updating a file only if the disk
- * file is newer than the corresponding archive entry.
- *
- * The compression method to use is determined when the file is added, based on
- * whichever method yields the smallest result.
- *
- * Language: Computer Innovations Optimizing C86
- */
- #include <stdio.h>
- #include "arc.h"
-
- main(num, arg) /* system entry point */
- INT num; /* number of arguments */
- char *arg[]; /* pointers to arguments */
- {
- char opt = 0;/* selected action */
- char *a; /* option pointer */
- char *makefnam(); /* filename fixup routine */
- char *upper();/* case conversion routine */
- char *index();/* string index utility */
- char *envfind(); /* environment searcher */
- INT n; /* argument index */
- char *arctemp2, *malloc();
- #ifdef BSD
- LONG getpid();
- #endif
- #ifdef MTS
- fortran guinfo();
- char gotinf[4];
- #endif
-
- if (num < 3) {
- printf("ARC - Archive utility, Version 5.20, created on 10/24/86 at 14:56:41\n");
- /*
- * printf("(C) COPYRIGHT 1985,86 by System Enhancement
- * Associates;"); printf(" ALL RIGHTS RESERVED\n\n");
- * printf("Please refer all inquiries to:\n\n"); printf("
- * System Enhancement Associates\n"); printf(" 21 New
- * Street, Wayne NJ 07470\n\n"); printf("You may copy and
- * distribute this program freely,"); printf(" provided
- * that:\n"); printf(" 1) No fee is charged for such
- * copying and"); printf(" distribution, and\n"); printf(" 2)
- * It is distributed ONLY in its original,"); printf("
- * unmodified state.\n\n"); printf("If you like this program,
- * and find it of use, then your"); printf(" contribution
- * will\n"); printf("be appreciated. You may not use this
- * product in a"); printf(" commercial environment\n");
- * printf("or a governmental organization without paying a
- * license"); printf(" fee of $35. Site\n");
- * printf("licenses and commercial distribution licenses
- * are"); printf(" available. A program\n"); printf("disk
- * and printed documentation are available for $50.\n");
- * printf("\nIf you fail to abide by the terms of this
- * license, "); printf(" then your conscience\n");
- * printf("will haunt you for the rest of your life.\n\n");
- */
- #ifdef MSDOS
- printf("Usage: ARC {amufdxerplvtc}[bswnoq][g<password>]");
- #endif
- #ifdef BSD
- printf("Usage: arc {amufdxerplvtc}[biswnoq][g<password>]");
- #endif
- #ifdef MTS
- printf("Parameters: {amufdxeplvtc}[biswnoq][g<password>]");
- #endif
- printf(" <archive> [<filename> . . .]\n");
- printf("Where: a = add files to archive\n");
- printf(" m = move files to archive\n");
- printf(" u = update files in archive\n");
- printf(" f = freshen files in archive\n");
- printf(" d = delete files from archive\n");
- printf(" x,e = extract files from archive\n");
- #ifndef MTS
- printf(" r = run files from archive\n");
- #endif
- printf(" p = copy files from archive to");
- printf(" standard output\n");
- printf(" l = list files in archive\n");
- printf(" v = verbose listing of files in archive\n");
- printf(" t = test archive integrity\n");
- printf(" c = convert entry to new packing method\n");
- printf(" b = retain backup copy of archive\n");
- #ifdef MTS
- printf(" i = suppress ASCII/EBCDIC translation\n");
- #endif
- #ifdef BSD
- printf(" i = suppress CRLF to '\\n' translation\n");
- #endif
- printf(" s = suppress compression (store only)\n");
- printf(" w = suppress warning messages\n");
- printf(" n = suppress notes and comments\n");
- printf(" o = overwrite existing files when");
- printf(" extracting\n");
- printf(" q = squash instead of crunching\n");
- printf(" g = Encrypt/decrypt archive entry\n");
- /* printf("\nPlease refer to the program documentation for");
- printf(" complete instructions.\n"); */
- return 1;
- }
- /* see where temp files go */
- /* use process id to insure unique temp files */
-
- #ifndef MTS
- arctemp = malloc(256);
- if (!(arctemp2 = envfind("ARCTEMP")))
- arctemp2 = envfind("TEMP");
- if (arctemp2)
- sprintf(arctemp, "%s.Arc%ld", arctemp2, getpid());
- else
- sprintf(arctemp, ".Arc%ld", getpid());
- #else
- guinfo("SHFSEP ", gotinf);
- sepchr[0] = gotinf[0];
- guinfo("SCRFCHAR", gotinf);
- tmpchr[0] = gotinf[0];
- arctemp = "-$$$";
- arctemp[0] = tmpchr[0];
- #endif
-
- #ifndef BSD
- /* avoid any case problems with arguments */
-
- for (n = 1; n < num; n++) /* for each argument */
- upper(arg[n]); /* convert it to uppercase */
- #else
- /* avoid case problems with command options */
- upper(arg[1]); /* convert to uppercase */
- #endif
-
- /* create archive names, supplying defaults */
- #ifndef BSD
- makefnam(arg[2], ".ARC", arcname);
- #else
- makefnam(arg[2], ".arc", arcname);
- #endif
- /* makefnam(".$$$",arcname,newname); */
- sprintf(newname, "%s.ARC", arctemp);
- makefnam(".BAK", arcname, bakname);
-
- /* now scan the command and see what we are to do */
-
- for (a = arg[1]; *a; a++) { /* scan the option flags */
- #ifndef MTS
- if (index("AMUFDXEPLVTCR", *a)) { /* if a known command */
- #else
- if (index("AMUFDXEPLVTC", *a)) {
- #endif
- if (opt)/* do we have one yet? */
- arc_abort("Cannot mix %c and %c", opt, *a);
- opt = *a; /* else remember it */
- } else if (*a == 'B') /* retain backup copy */
- keepbak = 1;
-
- else if (*a == 'W') /* suppress warnings */
- warn = 0;
- #ifndef MSDOS
- else if (*a == 'I') /* image mode, no ASCII/EBCDIC x-late */
- image = 1;
- #endif
-
- else if (*a == 'N') /* suppress notes and comments */
- note = 0;
-
- else if (*a == 'O') /* overwrite file on extract */
- overlay = 1;
-
- else if (*a == 'G') { /* garble */
- password = a + 1;
- while (*a)
- a++;
- a--;
- #ifdef MTS
- etoa(password, strlen(password));
- #endif
- } else if (*a == 'S') /* storage kludge */
- nocomp = 1;
-
- else if (*a == 'K') /* special kludge */
- kludge = 1;
-
- else if (*a == 'Q') /* use squashing */
- dosquash = 1;
-
- else if (*a == '-' || *a == '/') /* UNIX and PC-DOS
- * option markers */
- ;
-
- else
- arc_abort("%c is an unknown command", *a);
- }
-
- if (!opt)
- arc_abort("I have nothing to do!");
-
- /* act on whatever action command was given */
-
- switch (opt) { /* action depends on command */
- case 'A': /* Add */
- case 'M': /* Move */
- case 'U': /* Update */
- case 'F': /* Freshen */
- addarc(num - 3, &arg[3], (opt == 'M'), (opt == 'U'), (opt == 'F'));
- break;
-
- case 'D': /* Delete */
- delarc(num - 3, &arg[3]);
- break;
-
- case 'E': /* Extract */
- case 'X': /* eXtract */
- case 'P': /* Print */
- extarc(num - 3, &arg[3], (opt == 'P'));
- break;
-
- case 'V': /* Verbose list */
- bose = 1;
- case 'L': /* List */
- lstarc(num - 3, &arg[3]);
- break;
-
- case 'T': /* Test */
- tstarc();
- break;
-
- case 'C': /* Convert */
- cvtarc(num - 3, &arg[3]);
- break;
- #ifndef MTS
- case 'R': /* Run */
- runarc(num - 3, &arg[3]);
- break;
- #endif
- default:
- arc_abort("I don't know how to do %c yet!", opt);
- }
-
- return nerrs;
- }
-